#include "ModulePlot2D.h"

void ModulePlot2D::init(QCVModuleHandlerInterface * parent)
{
	this->parent=parent;
	win=new QWidget();
  layout=new QVBoxLayout(win);

	plot=new QwtPlot(win);
	grid=new QwtPlotGrid();
	grid->attach(plot);
	zoomer=new QwtPlotZoomer(plot->canvas());
	picker=new QwtPlotPicker(plot->canvas());
	layout->addWidget(plot);

	pb_process= new QPushButton("Process",win);
	pb_save =new QPushButton("Sauver les courbes",win);
	pb_fitView =new QPushButton("Auto Zoom",win);

	QHBoxLayout* hlayout=new QHBoxLayout();
	QHBoxLayout* hlayout2=new QHBoxLayout();

	rb_XY=new QRadioButton("Mode X-Y*",win);
	rb_Y=new QRadioButton("Mode Y*",win);
	rb_Y->setChecked(true);

	cb_autoProcess=new QCheckBox("Auto process",win);
	cb_autoProcess->setChecked(true);

	
	hlayout->addWidget(rb_Y);
	hlayout->addWidget(rb_XY);
	hlayout->addWidget(pb_fitView);

	hlayout2->addWidget(cb_autoProcess);
	hlayout2->addWidget(pb_process);

	layout->addLayout(hlayout);
	layout->addLayout(hlayout2);
	layout->addWidget(pb_save);

	curves=NULL;	
	nbCurves=0;

	colors<<QColor(255,0,0)<<QColor(0,255,0)<<QColor(0,0,255);
	colors<<QColor(255,255,0)<<QColor(255,0,255)<<QColor(0,255,255)<<QColor(255,128,0);
	colors<<QColor(128,255,0)<<QColor(255,0,128)<<QColor(128,0,255)<<QColor(0,128,255);
	colors<<QColor(0,255,128);
	
	connect(pb_save,SIGNAL(clicked()),this,SLOT(s_save()));
	connect(pb_fitView,SIGNAL(clicked()),this,SLOT(s_fitView()));
	connect(pb_process,SIGNAL(clicked()),this,SLOT(s_process()));
}
////////////////////////////////////////////////////////////////////////////////
void ModulePlot2D::free()
{
	if(curves)delete [] curves;
	delete win;
}
////////////////////////////////////////////////////////////////////////////////
cv::Mat & ModulePlot2D::process()
{
	if(cb_autoProcess->isChecked())
	{
		if(dataX.rows==dataY.rows)
		{
			if(curves)delete [] curves;
			curves=new QwtPlotCurve[dataY.cols];
			nbCurves=dataY.cols;
			for(int i=0;i<nbCurves;i++)
			{
				curves[i].setSamples((double*)dataX.data,(double*)dataY.col(i).data,dataY.rows);
				curves[i].attach(plot);
				QPen pen(colors[i]);
				pen.setWidth(2);
				curves[i].setPen(pen);
			}
		}
		else
		{
			std::cout<<"Erreur : Nombre de données X Y different\n";
		}
		plot->replot();
	}
}
////////////////////////////////////////////////////////////////////////////////
void ModulePlot2D::setInput(int n,const cv::Mat & m)
{
	if(n==0)
	{	
		dataY=m.clone();
		if(rb_Y->isChecked())
		{
			dataX.create(dataY.rows,1);
			for(int i=0;i<dataX.rows;i++)dataX(i)=i;
		}
	}
	else if(n==1)
	{	
		dataX=m.clone();
	}
}
////////////////////////////////////////////////////////////////////////////////
QWidget* ModulePlot2D::widget()
{
	return win;
}
////////////////////////////////////////////////////////////////////////////////
QString ModulePlot2D::getName()
{
	return tr("Plot 2D");
}
////////////////////////////////////////////////////////////////////////////////
int ModulePlot2D::nbInputs()
{
	return 1+rb_XY->isChecked();
}
////////////////////////////////////////////////////////////////////////////////
bool ModulePlot2D::setParams(QString params)
{
	QStringList list_params=params.split(";");
		
	if(list_params.size()==1)
	{
		cb_autoProcess->setChecked(list_params[0].toInt());
		return true;
	}
	else
	{
		return false;
	}	
}
////////////////////////////////////////////////////////////////////////////////
QString ModulePlot2D::getParams()
{
	return QString(cb_autoProcess->isChecked());
}

////////////////////////////////////////////////////////////////////////////////
QCVModuleInterface * ModulePlot2D::clone()
{
	return new ModulePlot2D;
}
////////////////////////////////////////////////////////////////////////////////
QString ModulePlot2D::help(int id)
{
	if(id==-2)
	{
		return trUtf8("Permet d'afficher une courbe grâce à Qwt");
	}
	else if(id==-1)
	{
		return tr("none");
	}
	else if(id==0)
	{
		return tr("vecteur");
	}
	else if(id==1)
	{
		return tr("vecteur");
	}
	else
	{
		return tr("erreur");
	}
}
////////////////////////////////////////////////////////////////////////////////
void ModulePlot2D::s_save()
{
	QString filename = QFileDialog::getSaveFileName(NULL,"Sauver des courbes","data",tr("*.csv"));
	if(!filename.isEmpty())
	{
		QFile file(filename);
		if(file.open(QIODevice::WriteOnly | QIODevice::Text))
		{
			QTextStream out(&file);

			int n=QInputDialog::getInt(win,trUtf8("Formatage des données"),trUtf8("Saut de ligne tous les (-1 --> aucun saut de ligne ) :"), -1, -1, 100000000, 1);
			for(int i=0;i<dataY.cols;i++)			
			{
				out<<"Courbe"<<i<<"\n";
				for(int j=0;j<dataY.rows;j++)			
				{
					if( (n!=-1) && (j%n==0) )out<<"\n";
					out<<dataY(j,i)<<";";
				}
			}
			
			out<<"Axe des X\n";
			for(int i=0;i<dataX.rows;i++)			
			{
				if( (n!=-1) && (i%n==0) )out<<"\n";
				out<<dataX(i)<<";";
			}

			file.close();
		}
	}
}
////////////////////////////////////////////////////////////////////////////////
void ModulePlot2D::s_fitView()
{
	if(nbCurves>1)
	{
		//QInputDialog::getInt("Numero de la courbe",		
		zoomer->zoom(curves[0].boundingRect());
	}
	if(nbCurves==1)
	{
		zoomer->zoom(curves[0].boundingRect());
	}
}
////////////////////////////////////////////////////////////////////////////////
void ModulePlot2D::s_process()
{
	if(dataX.rows==dataY.rows)
	{
		if(curves)delete [] curves;
		curves=new QwtPlotCurve[dataY.cols];
		nbCurves=dataY.cols;
		for(int i=0;i<nbCurves;i++)
		{
			curves[i].setSamples((double*)dataX.data,(double*)dataY.col(i).data,dataY.rows);
			curves[i].attach(plot);
			QPen pen(colors[i]);
			pen.setWidth(2);
			curves[i].setPen(pen);
		}
	}
	else
	{
		std::cout<<"Erreur : Nombre de données X Y different\n";
	}
	plot->replot();
}
////////////////////////////////////////////////////////////////////////////////
Q_EXPORT_PLUGIN2(ModulePlot2D_plugin,ModulePlot2D);
